package com.cskaoyan.javase.array._4operation._0traverse;

import java.util.concurrent.locks.ReadWriteLock;

/**
 * 数组的遍历（traverse）是最最基本的操作，是进行数组中其它操作的基础。
 * 它的含义是依次访问（或输出）数组中的每一个元素。
 * 这里我们以依次访问并输出数组中的元素为例子，来手写一下数组元素的遍历。
 *
 * @since 15:06
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        /*System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        // for循环遍历数组元素输出
        for (int i = 0; i < 3; i++) {
            System.out.println(arr[i]);
        }
        // 改进,手动for循环遍历数组的快捷键 数组名.fori
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }*/
        // arr = new int[0];
        arr = null;
        traverse7(arr);
    }

    public static void traverse(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    /*
        上述方法实现,格式不够美观
        改进它,让它更美观
        希望输出的格式是: [1, 2, 3]
     */
    public static void traverse2(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }

    /*
        上述方法输出的格式是:[1, 2, 3, ]
        改进有两种方式:
            1.转义字符"\b"删除
            2.if判断,是最后一个元素,不要再加逗号了
     */
    public static void traverse3(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            // 判断是最后一个元素,不加逗号了
            if (i == arr.length - 1) {
                System.out.print(arr[i]);
                // 这里已经是打印最后一个元素,不需要再次打印了,应该结束循环了
                break;
            }
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }

    public static void traverse4(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    /*
        以上方法可以接收长度为0以及null数组,这些特殊的输入吗?
        目前显然是达不到的,所以这里仍然需要做一些改进
     */
    // 改进一: 允许方法传入长度为0的数组
    // 改进的思路是: 一旦传入长度为0的数组,给出友好的提示,不打印其它额外信息
    public static void traverse5(int[] arr) {
        // 判断一下长度为0,做出特殊的处理
        /*
            这里是:
                判断数组长度为0好?
                还是判断数组长度不是0好?
            使用if的原则是:
                if大括号中内容应该尽量少
            这里判断"=="会更好,代码更简洁
         */
        if (arr.length == 0) {
            System.out.println("您输入的数组是长度为0的数组,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    // 改进二: 允许方法传入null的数组
    // 改进的思路: 一旦传入null的数组,给出友好的提示,不打印其它额外信息
    public static void traverse6(int[] arr) {
        // 先判断null,再判断长度为0
        // 并且这里要判断"==",而不是"!="
        if (arr == null) {
            System.out.println("您输入的数组是null数组,请重新输入!");
            return;
        }
        if (arr.length == 0) {
            System.out.println("您输入的数组是长度为0的数组,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    // 改进三: 同时判断不正常数组的情况,包括长度为0以及null数组
    public static void traverse7(int[] arr) {
        // 同时判断null和长度为0,标准范式
        if (arr == null || arr.length == 0) {
            System.out.println("您输入的数组不正常,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }
}
